查看原文
其他

可能是最全最易记的CSS选择器分类大法

JowayYoung IQ前端 2021-07-27

前言

最近查看了几位同事的代码,发现很多CSS书写习惯都是清一色的类名而没有相应的选择器,层层嵌套的标签都包含至少一个类名。有些同学会问,很多文章都说「选择器」有性能问题,为什么还需要使用「选择器」呢?

是的,「选择器」「类名」对比起来性能上确实没有后者那么好,但是如今浏览器对于CSS的解析速度已得到大大的提升,完全可忽略「选择器」那丁点的性能问题。有兴趣的同学可自行百度搜索CSS选择器性能的相关问题进行学习。多一个技巧多一份保障!

本文不细说「选择器」的性能问题,先来对选择器做一个功能性的分类。当然,熟悉全部CSS选择器是玩转CSS的最最最最最基本功。本文是玩转CSS的入门讲解,先来把基础搞掂,后续的CSS文章再为大家讲解如何妙用选择器,喜欢CSS并且想玩CSS的可持续关注我哟。

分类

在讲解选择器的奇妙用处之前,还是先把选择器进行分类记忆吧。没错,我就是喜欢总结。由于选择器的标准概念上没有作出明确的分类,以下的分类是为了方便记忆进行整理的,仅供参考不喜勿喷。

基础选择器

选择器别名说明版本
tag标签选择器指定类型的标签1
#idID选择器指定身份的标签1
.class类选择器指定类名的标签1
*通配选择器所有类型的标签2

层次选择器

选择器别名说明版本
elemP elemC后代选择器元素的后代元素1
elemP>elemC子代选择器元素的子代元素2
elem1+elem2相邻同胞选择器元素相邻的同胞元素2
elem1~elem2通用同胞选择器元素后面的同胞元素3

集合选择器

选择器别名说明版本
elem1,elem2并集选择器多个指定的元素1
elem.class交集选择器指定类名的元素1

条件选择器

选择器说明版本
:lang指定标记语言的元素2
:dir()指定书写方向的元素4
:has包含指定元素的元素4
:is指定条件的元素4
:not非指定条件的元素4
:where指定条件的元素4
:scope指定元素作为参考点4
:any-link所有包含href链接元素4
:local-link所有包含href且属于绝对地址的链接元素4

行为选择器

选择器说明版本
:active鼠标激活的元素1
:hover鼠标悬浮的元素1
::selection鼠标选中的元素3

状态选择器

选择器说明版本
:target当前锚点的元素3
:link未访问的链接元素1
:visited已访问的链接元素1
:focus输入聚焦的表单元素2
:required输入必填的表单元素3
:valid输入合法的表单元素3
:invalid输入非法的表单元素3
:in-range输入范围以内的表单元素3
:out-of-range输入范围以外的表单元素3
:checked选项选中的表单元素3
:optional选项可选的表单元素3
:enabled事件启用的表单元素3
:disabled事件禁用的表单元素3
:read-only只读的表单元素3
:read-write可读可写的表单元素3
:target-within内部锚点元素处于激活状态的元素4
:focus-within内部表单元素处于聚焦状态的元素4
:focus-visible输入聚焦的表单元素4
:blank输入为空的表单元素4
:user-invalid输入合法的表单元素4
:indeterminate选项未定的表单元素4
:placeholder-shown占位显示的表单元素4
:current()浏览中的元素4
:past()已浏览的元素4
:future()未浏览的元素4
:playing开始播放的媒体元素4
:paused暂停播放的媒体元素4

结构选择器

选择器说明版本
:root文档的根元素3
:empty无子元素的元素3
:first-letter元素的首字母1
:first-line元素的首行1
:nth-child(n)元素中指定顺序索引的元素3
:nth-last-child(n)元素中指定逆序索引的元素3
:first-child元素中为首的元素2
:last-child元素中为尾的元素3
:only-child父元素仅有该元素的元素3
:nth-of-type(n)标签中指定顺序索引的标签3
:nth-last-of-type(n)标签中指定逆序索引的标签3
:first-of-type标签中为首的标签3
:last-of-type标签中为尾标签3
:only-of-type父元素仅有该标签的标签3

属性选择器

选择器说明版本
[attr]指定属性的元素2
[attr=val]属性等于指定值的元素2
[attr*=val]属性包含指定值的元素3
[attr^=val]属性以指定值开头的元素3
[attr$=val]属性以指定值结尾的元素3
[attr~=val]属性包含指定值(完整单词)的元素(不推荐使用)2
[attr\|=val]属性以指定值(完整单词)开头的元素(不推荐使用)2

伪元素

选择器说明版本
::before在元素前插入的内容2
::after在元素后插入的内容2

优势

话说选择器如果没有用处,那W3C还干嘛把它纳入到标准里面呢?选择器的劣势就不多说了,使用不当可能会引起解析性能问题,这个对于现代浏览器来说几乎可忽略,除非你还是IE的忠实粉丝。使用选择器有什么好处呢,我给大家总结一下。

  • 对于那些结构与行为分离的写法,使用Sass/Less书写属性时结构会更加清晰易读
  • 减少很多无用或者少用的类名,保持css文件的整洁性和观赏性,代码也是一门艺术
  • 减少修改类名而有可能导致样式失效的问题,有时修改类名没有确保HTML中和CSS中的一致而导致样式失效
  • 减少没有实质性使用的类名,例如很多层嵌套的标签,这些标签可能只使用到一个CSS属性,就没有必要建个类名来关联
  • 使用选择器可完成很多曾经需要配合JS来完成的交互效果,既可减少代码量也可减少JS对DOM的操作,使得交互效果更流畅

总结

大家可看看我写的这篇接近10万阅读量的文章《灵活运用CSS开发技巧》,点击下方「阅读原文」即可。罗列了66个CSS开发技巧,其中大多数效果是基于选择器实现的,有兴趣的小伙伴可详细查阅代码,了解下选择器的开发技巧和使用场景。

好了,记完这么多选择器,下一篇就来玩CSS选择器了。如果你喜欢CSS,那么赶紧关注下方二维码「IQ前端」,更多的CSS开发技巧敬请期待!

结语

「❤️关注+点赞+收藏+评论+转发❤️」,原创不易,鼓励笔者创作更好的文章

「关注公众号IQ前端,一个专注于CSS/JS开发技巧的前端公众号,更多前端小干货等着你喔」

  • 关注后回复关键词免费领取视频教程
  • 关注后添加我微信拉你进技术交流群
  • 欢迎关注IQ前端,更多「CSS/JS开发技巧」只在公众号推送


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存